21.1 标准库的使用
标准头:依据C标准,一个“标准头”不需要一定是文件,有可能内置在编译器自身中。
标准库:C语言的标准库总共划分成15
个部分,每个部分用一个头描述。
扩展:许多编译器会使用扩展后的库,这类库(头文件)通常提供一些针对特定情形或特定操作系统的函数(比如更多对屏幕或键盘操作的函数,用于支持图形或窗口界面的头等)
21.1.1 包含标准头的程序中使用的名字的一些限制
意义:虽然这些规则并不总是强制性的,但不遵守这些规则可能会导致程序的可移植性下降。
必需遵守
- 宏的名字:不能再使用在头文件中定义过的宏的名字
- 类型名(
typedef
):具有文件作用域的库名(包括类型名)不可以在文件层次重新定义
建议遵守(避开保留字)
- 由
_大写字母
或__
开头的标识符 - 由
_
开头的标识符(除非仅声明在函数内部) - 标准库中所有具备外部链接的标识符,特别是所有标准库中的函数
21.1.2 使用宏隐藏函数
说明:标准库中经常会为小的实际函数定义同名的宏函数,这是允许的,目的是提高程序的运行速度。
取消隐藏:如果需要尽量缩小可执行代码的大小,或者需要一个指向这个库函数的指针,可以使用undef
取消相应的红定义即可。
1 |
绕过宏调用:可以通过为函数名加圆括号来屏蔽个别宏调用
1 | (isptint)(); // 预处理器无法分辨出带圆括号的宏,而编译器仍可认出isprint函数 |
21.2 标准库概述
概述 | 标准头(15个) | 提供的功能 | 相关章节 | |
---|---|---|---|---|
诊断 | assert.h | 仅包含assert 宏,检查程序的状态,一旦任何检查失败,程序终止 |
24.1 | |
字符处理 | ctype.h | 包括用于字符分类及大小写转换的函数 | 23.4 | |
错误 | errno.h | 提供了errno("errno number") ,errno是一个左值,可以在调用特定苦函数后进行监测,来判断调用过程中是否有错误发生 |
24.2 | |
浮点型的特点 | float.h | 提供了用于描述浮点型特点的宏,包括值的范围及精度 | 23.1 | |
整型的大小 | limits.h | 提供了用于描述整数类型和字符类型的宏,包括它们的最大值和最小值 | 23.2 | |
本地化 | locale.h | 与本地化相关的行为,包括小数点的字符、货币的格式、字符集一集日期和时间的显示 | 25.1 | |
数学计算 | math.h | 大量用于数据计算的函数,大部分使用double类型的实参,并返回一个double类型的值 | 23.3 | |
非本地条转 | setjmp.h | setjmp函数和longjmp函数^21-2-7 | 24.4 | |
信号处理 | signal.h | 用于异常情况(信号)处理的函数,包括终端和运行时错误^21-2-8-signal | 24.4 | |
可变实际参数 | stdarg.h | 提供给函数可以处理不定个参数的的工具,就像printf 和scanf 函数 |
26.1 | |
常用定义 | stddef.h | 提供了经常使用的类型和宏的定义 | 21.3 | |
输入/输出 | stdio.h | 提供了大量用于输入/输出的函数,包括对顺序读写和随机读写文件的操作 | 22.1 | |
常用实用程序 | stdlib.h | 包含了大量无法华贵其它头的函数[^stdlib] | 26.2 | |
字符串处理 | string.h | 提供了用于进行字符串操作的函数,包括肤质、拼接、比较以及搜索 | 23.5 | |
日期与时间 | time.h | 提供相应的函数来获取日期和时间、操作时间和以多种方式显示时间等。 | 26.3 |
21.3 :常用定义
说明:stddef.h
提供了常用的类型和宏的定义,但没有声明任何函数。
21.3.1 定义的类型
类型 | 说明 | 原始类型 |
---|---|---|
ptrdiff_t | 当记性指针相减运算时,其结果的类型 | 整数类型 |
size_t | 运算符sizeof 的返回值类型 |
整数类型 |
wchar_t | 一种足够大的、可以用于表示所有支持的地区的所有字符的类型 | 整数类型 |
21.3.2 定义的宏
宏 | 说明 |
---|---|
NULL | 空指针 |
offsetof | 计算结构的起点到指定成员间的字节数 |
啊。,>.u≥Á__说明:计算结构成员的偏移量(距结构起点的距离)
用途:对人和编译器都会返回正确的偏移量,使我们可以编写一致性更好的程序。
结构体成员的偏移量:一些编译器会在结构中留下一些空洞(无效字节),从而影响到offsetof
产生的值。
@param {struct}
结构类型本身(不是实例)@param {*}
结构的成员@return {int}
结构的起点到指定成员的字节数
1 | struct s { |
1 | offsetof(struct s, a); // 0,C语言确保结构的第一个成员的地址与结构自身地址相同 |
[^stdlib]: 包含在<stdlib.h>
中的函数可以将字符串转换成数、产生随机值、执行内存管理任务、域操作系统通信、执行搜索与排序以及对多字节字符及字符串进行操作。